package servlet;


import dao.UsersDao;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import pojo.Users;
import pojo.ViolationRecords;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

@WebServlet("/users/*")
public class UsersServlet extends BaseServlet {
    //service——》database——》service
    //    将Dao作为属性使用
    public UsersDao usersDao = new UsersDao();

    /**
     * 删除用户
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void deleteUser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html; charset=utf-8");
        PrintWriter out = resp.getWriter();

// 从查询字符串中获取bookId
        String userIdParam = req.getParameter("userId");

        try {
            int userId = Integer.parseInt(userIdParam); // 将字符串转换为int类型
            System.out.println("userId=" + userId);
            // 调用Dao的up方法，传入userId,
            // 将is_admin改为1
            int row = usersDao.deleteUser(userId);

            // 根据操作结果进行相应处理，例如重定向或设置属性
            if (row > 0) {
                // 操作成功，可能需要重定向或设置消息
                out.write("成功");
            } else {
                // 操作失败，处理错误情况
                out.write("失败");
            }
        } catch (NumberFormatException e) {
            // 转换错误，userId不是有效的数字
            System.out.println("userId不是有效的数字");
            out.write("userId不是有效的数字");
        }
    }

    /**
     * 解禁用户（将status改为1）
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void unlockUser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html; charset=utf-8");
        PrintWriter out = resp.getWriter();

// 从查询字符串中获取bookId
        String userIdParam = req.getParameter("userId");

        try {
            int userId = Integer.parseInt(userIdParam); // 将字符串转换为int类型
            System.out.println("userId=" + userId);
            // 调用Dao的up方法，传入userId,
            // 将is_admin改为1
            int row = usersDao.unlockUser(userId);

            // 根据操作结果进行相应处理，例如重定向或设置属性
            if (row > 0) {
                // 操作成功，可能需要重定向或设置消息
                out.write("成功");
            } else {
                // 操作失败，处理错误情况
                out.write("失败");
            }
        } catch (NumberFormatException e) {
            // 转换错误，userId不是有效的数字
            System.out.println("userId不是有效的数字");
            out.write("userId不是有效的数字");
        }
    }

    /**
     * 查看所有违规记录
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void findAllViolation(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html; charset=utf-8");
        PrintWriter out = resp.getWriter();
        System.out.println("findAll");
//        数据用集合接收
        List<ViolationRecords> list = usersDao.findAllViolation();

        // 将list添加到请求属性中，以便在JSP页面中使用
        req.setAttribute("list", list);

        // 转发请求到JSP页面
        RequestDispatcher dispatcher = req.getRequestDispatcher("/violationList.jsp");
        dispatcher.forward(req, resp);
    }

    /**
     * 将用户升级为管理员
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void upUser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html; charset=utf-8");
        PrintWriter out = resp.getWriter();

// 从查询字符串中获取bookId
        String userIdParam = req.getParameter("userId");

        try {
            int userId = Integer.parseInt(userIdParam); // 将字符串转换为int类型
            System.out.println("userId=" + userId);
            // 调用Dao的up方法，传入userId,
            // 将is_admin改为1
            int row = usersDao.upUser(userId);

            // 根据操作结果进行相应处理，例如重定向或设置属性
            if (row > 0) {
                // 操作成功，可能需要重定向或设置消息
                out.write("成功");
            } else {
                // 操作失败，处理错误情况
                out.write("失败");
            }
        } catch (NumberFormatException e) {
            // 转换错误，userId不是有效的数字
            System.out.println("userId不是有效的数字");
            out.write("userId不是有效的数字");
        }
    }


    /**
     * 展示所有用户
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void findAll(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html; charset=utf-8");
        PrintWriter out = resp.getWriter();
        System.out.println("findAll");
//        书本数据用集合接收
        List<Users> usersList = usersDao.findAllUser();

        // 将list添加到请求属性中，以便在JSP页面中使用
        req.setAttribute("usersList", usersList);

        // 转发请求到JSP页面
        RequestDispatcher dispatcher = req.getRequestDispatcher("/usersList.jsp");
        dispatcher.forward(req, resp);
    }

    /**
     * 检查是否为管理员（admin_id=0不是,1是）
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void adminCheck(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        Integer userId = (Integer) session.getAttribute("userId");
        System.out.println("从Session中获取中获取用户ID=" + userId);
        // 使用userId来查询当前用户权限
        int isAdmin = usersDao.findAdminByUserId(userId);
        if (isAdmin > 0) {
            resp.sendRedirect("/adminList.html");
        } else {
            resp.sendRedirect("/notAdmin.html");
        }
    }

    /**
     * 接收登录请求，完成登录操作
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //        接收客户端参数
        String username = req.getParameter("username");//接收键值对
        String password = req.getParameter("password");//接收键值对
        //        调用usersDao的findByUsername方法,根据用户名查询信息
        Users loginUser = usersDao.findByUsername(username);

        if (loginUser == null) {//判断能不能通过username找到数据库里的数据
//            用户名有误,跳转到用户名有误页
            resp.sendRedirect("/loginUsernameError.html");//要写绝对路径，不然会默认在当前路径跳转
        } else if (!(password.equals(loginUser.getPassword()))) {
//            密码有误，跳转到密码有误页
            resp.sendRedirect("/loginUserPwdError.html");//要写绝对路径，不然会默认在当前路径跳转
        } else {
//            在用户登录成功后，可以将用户ID存储在HTTP Session中。
//            然后在任何需要的地方从Session中获取它。
            HttpSession session = req.getSession();
            session.setAttribute("userId", loginUser.getUserId()); // 将用户ID存储在Session中
//            跳转到首页home
            resp.sendRedirect("/home.html");//要写绝对路径，不然会默认在当前路径跳转
        }
    }

    /**
     * 接受用户注册请求用的方法
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void regist(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        接收客户端参数
        String username = req.getParameter("username");//接收键值对
        String password = req.getParameter("password");//接收键值对
//        调用usersDao的addUser方法，完成注册功能
//        将参数放入一个Users对象中，在调用addUser方法时传入
        Users user = new Users(null, username, password, null, null,null);

        int rows = usersDao.addUser(user);

        System.out.println(rows);
//        根据注册结果（成功，失败）跳转到对应页面
        if (rows > 0) {
//            sendRedirect:重定向
            resp.sendRedirect("/registSuccess.html");//要写绝对路径，不然会默认在当前路径跳转
        } else {
            resp.sendRedirect("/registFail.html");//要写绝对路径，不然会默认在当前路径跳转
        }
    }
}


